#ifndef _OTA_PROTOCOL_H
#define _OTA_PROTOCOL_H

#include <stdint.h>


#pragma pack(1)

typedef enum                               
{   
    CMD_OTA                         = 0x04,         // 下发升级命令
    CMD_OTA_DATA                    = 0x05,         // 下发OTA升级报文
    CMD_OTA_STATE                   = 0x06,         // 上报OTA升级状态
}ProtocolCmdOtaEnum_e; 
typedef enum
{
    ERR_LEN                         = 0x01,         // 报文长度错误
    ERR_MAC,										// 报文mac错误
    ERR_SUM,										// 报文数据区出错
}ErrEnum_e;
typedef enum
{
    EXE_DEVREADY                    = 0x01,         // 准备升级
    EXE_ERRSUM                      = 2,            // 校验和错误
    EXE_ERRMAC                      = 3,            // 终端MAC错误
    EXE_ERRVER                      = 4,            // 版本错误
    EXE_ERRSIZE                     = 5,            // 固件大小错误
    EXE_RECVDONE                    = 6,            // 接收数据包完成
    EXE_PKTVALID                    = 7,            // 断点续传请求有效
    EXE_PKTERRVER                   = 8,            // 断点续传版本错误
    EXE_PKTERRCNT                   = 9,            // 断点续传包号错误
}OtaExecResEnum_e;
typedef enum
{
	OTA_IDLE						= 0x00,			// OTA空闲
	OTA_FINISHED					= 1,			// OTA接收完成
	OTA_SUSPEND						= 2,			// OTA接收中断
	OTA_RUN							= 3,			// OTA运行
}OTAState_e;

typedef struct 
{
	OTAState_e		otastate;
    uint8_t			otasoftver;
    uint32_t        otafilesize;
    uint16_t        otapktall;
    uint16_t        otapktcnt;
    uint8_t         otamd5buff[16];
}OtaPktInfo_t;

typedef struct 
{
    uint8_t         updateflag;                     // 更新固件标识
    uint8_t         softver;                        // 运行的固件版本
    OtaPktInfo_t    otaupdate;                      // ota升级信息
}UpdateParaInfo_t;

typedef struct
{
    ProtocolCmdOtaEnum_e cmd;
    uint32_t             devid;
    uint16_t             cmdid;
}MSGHeadInfo_t;

/*                  Protocol 2.2.4: OTA Command               */
/***********************Downlink MSG typedef*******************/
typedef struct
{
    uint16_t                        len;                  // 报文总长度
    uint8_t                         softver;              // 固件版本号
    uint32_t                        filesize;             // 固件文件大小
    uint8_t                         md5buff[16];          // 固件md5校验值
    uint32_t                        sum32;                // 除sum32之外的负载数据累计和
}ProtocolCmdOtaPayload_t;
typedef struct
{
    ProtocolCmdOtaEnum_e            cmd;                  // 命令头
    uint32_t                        devid;                // 终端id
    uint16_t                        cmdid;                // 命令id
    ProtocolCmdOtaPayload_t         payload;              // 负载数据
}ProtocolCmdOtaMsgType_t;

/*************************Uplink MSG typedef*******************/

typedef struct
{
    ProtocolCmdOtaEnum_e            cmd;                  // 命令头
    uint32_t                        devid;                // 终端id
    uint16_t                        cmdid;                // 命令id
    OtaExecResEnum_e                execres;              // 负载数据
}ProtocolAckOtaMsgType_t;


/*                 Protocol 2.2.5: OTA DATA Command           */
/***********************Downlink MSG typedef*******************/
typedef struct
{
    uint16_t                        pktall;               // 固件总包数
    uint16_t                        pktcnt;               // 固件包序号
    uint16_t                        len;                  // 实际的固件数据包数据长度
    uint8_t                         pktbuff[256];         // 数据包内容，不满256字节填0
    uint32_t                        sum32;                // 除sum32之外的负载数据累计和
}ProtocolOtaDataPayload_t;
typedef struct
{
    ProtocolCmdOtaEnum_e            cmd;                  // 命令头
    uint32_t                        devid;                // 终端id
    uint16_t                        cmdid;                // 命令id
    ProtocolOtaDataPayload_t        payload;              // 负载数据
}ProtocolCmdOtaDataMsgType_t;

/*************************Uplink MSG typedef*******************/
typedef struct
{
    ProtocolCmdOtaEnum_e            cmd;                  // 命令头
    uint32_t                        devid;                // 终端id
    uint16_t                        cmdid;                // 命令id
    OtaExecResEnum_e                execres;              // 负载数据
}ProtocolAckOtaDataMsgType_t;

/*                 Protocol 2.2.6: OTA STATE Command           */
/***********************Downlink MSG typedef*******************/
typedef struct
{
    ProtocolCmdOtaEnum_e            cmd;                  // 命令头
    uint32_t                        devid;                // 终端id
    uint16_t                        cmdid;                // 命令id
    OtaExecResEnum_e                execres;              // 负载数据
}ProtocolAckOtaStateMsgType_t;

/*************************Uplink MSG typedef*******************/
typedef enum
{
    REPKT                           = 0x01,               // 断点续传请求
    OTA_STATE_DONE,                                       // OTA更新固件成功
    OTA_STATE_FAIL,                                       // OTA更新固件失败
}OTAOptType_e;
typedef struct
{
    OTAOptType_e                    opttype;              // OTA状态上报类型
    uint8_t                         softver;              // 固件版本号，断点续传有效
    uint16_t                        pktcnt;               // 包序号，断点续传有效
}ProtocolOtaStatePayloadType_t;

typedef struct
{
    ProtocolCmdOtaEnum_e            cmd;                  // 命令头
    uint32_t                        devid;                // 终端id
    ProtocolOtaStatePayloadType_t   payload;              // 负载数据
}ProtocolCmdOtaStateMsgType_t;


#pragma pack()

extern UpdateParaInfo_t UpdatePataInfo;





#endif
